#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int len = 0;
int a[20];
LL backup[20][2];
// backup[i][0]：深度为i， 以非1为根的子树的节点数。
// backup[i][1]：深度为i， 以 1为根的子树的节点数。

// depth：深度， now当前数字， border:当前数字是不是边界
LL dfs(int depth, int now, bool border) {
  if (depth > len) {
    return 1;
  }
  if (!border && backup[depth][now == 1] != -1)
    return backup[depth][now == 1];
  LL res = 0;
  int x = border ? a[depth] : 9;
  for (int son = 0; son <= x; son++) {
    if (now == 1 && son == 3)
      continue;
    res += dfs(depth + 1, son, border && son == x);
  }
  if (!border)
    backup[depth][now == 1] = res;
  return res;
}

int main() {
  string s;
  cin >> s;
  len = s.size();
  for (int i = 0; i < len; i++) {
    a[i + 1] = s[i] - '0';
  }
  memset(backup, -1, sizeof(backup));
  cout << dfs(1, -1, true) - 1;
  return 0;
}